"""
题目：删除双链表中第一个值等于目标值的节点。
"""
class Node:
    def __init__(self, val=0, prev=None, next=None):
        self.val = val
        self.prev = prev
        self.next = next

def delete_node(head, targetValue):
    # 空链表直接返回
    if not head:
        return None
    current = head
    # 查找目标节点
    while current:
        if current.val == targetValue:
            # 情况1：目标节点是头节点
            if current.prev is None:
                new_head = current.next  # 下一个节点是头节点
                if new_head:  # 如果新头节点存在，补充更新其prev; 新的头结点如果是None，即原双链表只有一个节点，也不影响，不进入这个if,直接走后面的return
                    new_head.prev = None
                #返回的是new_head，即新的双链表的头结点
                return new_head
            # 情况2：目标节点是尾节点
            if current.next is None:
                current.prev.next = None  # 前节点的next设为None 因为前节点的next即将不存在了(被逻辑删除了)
                ##返回的是原先的head节点，不影响，因为head节点没变过
                return head
            # 情况3：目标节点是中间节点
            prev_node = current.prev
            next_node = current.next
            prev_node.next = next_node  # 前节点的next指向后节点
            next_node.prev = prev_node  # 后节点的prev指向前节点
            ##返回的是原先的head节点，不影响，因为head节点没变过
            return head
        # 如果当前节点不是目标节点，则继续查找
        current = current.next
    # 未找到目标节点(因为如果找到的话，则在前面3处的return就返回了)，最终返回原头节点
    return head


#基于参数 创建双链表 绑定好相邻节点的前后关系
def create_doubly_linked_list(arr):
    if not arr:
        return None
    head = Node(arr[0])
    current = head
    ##为所有节点 绑定好 前后关系
    for val in arr[1:]:
        new_node = Node(val)
        current.next = new_node
        new_node.prev = current
        current = new_node
    return head


def traverse_forward(head):
    result = []
    current = head
    while current:
        result.append(current.val)
        current = current.next
    return result


# 测试
head = create_doubly_linked_list([1, 2, 3, 4, 5])
head = delete_node(head, 3)  # 删除中间节点3
print(traverse_forward(head))  # 输出: [1, 2, 4, 5]

head = delete_node(head, 1)  # 删除头节点1
print(traverse_forward(head))  # 输出: [2, 4, 5]

head = delete_node(head, 5)  # 删除尾节点5
print(traverse_forward(head))  # 输出: [2, 4]
